from sklearn.datasets import make_circles, make_moons
import matplotlib.pyplot as plt
from sklearn.svm import SVC
import numpy as np

def plot_svc_decision_function(model, ax=None):
    if ax is None:
        ax = plt.gca()  # 构建一个坐标轴对象
    xlim = ax.get_xlim()  # 获取坐标轴的取值,0,1

    ylim = ax.get_ylim()  # 获取坐标轴的取值,0,1
    print("xlim:{},ylim:{}".format(xlim, ylim))

    # create grid to evaluate model
    xx = np.linspace(xlim[0], xlim[1], 30) # 生成30个数据的一个等差数列
    yy = np.linspace(ylim[0], ylim[1], 30)
    YY, XX = np.meshgrid(yy, xx) # 建立一个网格，由xx 和 yy的每个元素进行组合构成网格
    xy = np.vstack([XX.ravel(), YY.ravel()]).T  # 二维网格的x和y坐标转换为一个二维数组，其中每行代表一个点的(y, x)坐标对。
    P = model.decision_function(xy).reshape(XX.shape)

    ax.contour(XX, YY, P, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)


if __name__ == '__main__':
    # 生成一个环形的数据集
    x, y = make_circles(100, factor=0.1, noise=0.1, random_state=10)
    # 生成一个月牙型的数据集 ,noise为点的程度。
    # x, y = make_moons(1000, noise=0.1, random_state=10)
    print(x.shape, y.shape)

    plt.scatter(x[:,0], x[:,1], c=y, s=50, cmap="rainbow")


    svm = SVC(kernel='rbf')
    result = svm.fit(x, y)

    plot_svc_decision_function(svm)
    plt.show()

    print(svm.score(x, y))